package com.wjm.api.FileOutputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Data:2022年07月09日
 * Author:wjm
 * Content: InputStream(字节输入流抽象类)  和 FileInputStream实现类
 *
 *
 *  InputStream是一个抽象类，是字节输入流的顶级父类，FileInputStream是它的实现类
 *
 *
 *  InputStream中的常用方法
 *              public void close()  关闭输入流并释放与此流相关的任何系统资源
 *              public int read(byte[] b)  从输入流读取数据的下一个字节(一次读取一段)
 *              public abstract int read() 从输入流读取一些字节数，并存储到字节数组b中(一次只能读一个)
 *  注意：如果没有读取到末尾，read()返回的是当前读取到的内容对应的ASCII值，而read(byte[] b)返回的是读取到的长度
 *       如果read方法读取到了末尾，read()read(byte[] b)和都会返回-1,
 *
 *
 *  String的构造方法（可以与read(byte[] b)一起用）
 *              String(byte[] bytes, int offset, int length)
 *              通过使用平台的默认字符集解码指定的 byte 子数组，构造一个新的 String。offset表示从数组的那个下标开始，length表示长度
 *
 *
 *  解码指定的 byte 数组，构造一个新的 String。
 *             System.out.println(new String(bytes));
 *             不推荐这个方式，因为会出现多余的无用内容，比如文件里存的是abcde，而这个数组长度是3，它会输出 abc  dec末尾会多一个c
 *             我们可以使用String重载的构造方法，每次给字符串指定长度,如下：
 *             String(byte[] bytes, int offset, int length)
 *
 */
public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //使用 read()读数据
        method1();
        System.out.println("----------------");
        //使用 read(byte[] b)读数据
        method2();
    }

    /**
     * 使用 read(byte[] b)读数据
     * @throws IOException 抛出读数据时可能存在的异常
     */
    private static void method2() throws IOException {
        //创建输入流对象,如果找不到文件会抛出异常
        FileInputStream fis = new FileInputStream("a.txt");

        //创建存放读取内容的数组
        byte[] bytes = new byte[3];
        int a;
        //用while循环读取数据
        while ((a=fis.read(bytes)) != -1){
            /*
            * 解码指定的 byte 数组，构造一个新的 String。
            * System.out.println(new String(bytes));
            * 不推荐这个方式，因为会出现多余的无用内容，比如文件里存的是abcde，而这个数组长度是3，它会输出 abc  dec末尾会多一个c
            * 我们可以使用String重载的构造方法，每次给字符串指定长度
            * String(byte[] bytes, int offset, int length)
            * */
            System.out.println(new String(bytes,0,a));
        }
        //关闭流连接，释放资源
        fis.close();
    }

    /**
     * 使用 read()读数据
     * @throws IOException 抛出读数据时可能存在的异常
     */
    private static void method1() throws IOException {
        //创建输入流对象,如果找不到文件会抛出异常
        FileInputStream fis = new FileInputStream("a.txt");

        int a ;
        //用while循环读取数据
        while ((a=fis.read()) != -1){
            //这里的a表示的是内容对应的ASCII值
            //System.out.println(a);
            //如果想要看到具体内容需要强转为char类型
            System.out.println((char) a);
        }
        //关闭流连接，释放资源
        fis.close();
    }
}
